#'@TODO: 计算相关性，利用R包parallel并行计算,可能会有环境变量问题，需要注意，必要的话拆开fun，直接在全局变量里跑，应该是没有问题的
#'@param input: 根据R包correlation::correlation函数参数设置，默认p_adjust='holm'，method为相关性计算方法，默认'pearson'
#'@param input: intreset_gene_exp，你的兴趣基因表达谱，特征在行，样本在列，行名基因名，列名样本名
#' 
#'@param input: exp，你的对比表达谱，特征在行，样本在列，一般行名基因，列名样本名
#' 
#'@param return_file_style: 数据框
#'@param return_file: 名字自定义，一个包含p值，p值计算方法，相关性计算方法的复合型数据框
#' 
#'@Author: WYK
corr <- function(intreset_gene_exp = NULL, exp = NULL, p_adjust = "holm", method = "pearson") {
    exp <- as.data.frame(t(exp))
    intreset_gene_exp <- as.data.frame(t(intreset_gene_exp))
    genename <- colnames(exp)
    exp <- exp[na.omit(match(rownames(intreset_gene_exp), rownames(exp))), ]
    intreset_gene_exp <- intreset_gene_exp[na.omit(match(rownames(exp), rownames(intreset_gene_exp))),
        ]

    rownames(exp) == rownames(intreset_gene_exp)

    library(parallel)
    no_cores <- detectCores()
    cl <- makeCluster(no_cores - 2)

    i <- 1
    a <- data.frame()
    b <- data.frame()
    c <- data.frame()

    clusterExport(cl, c("genename", "i", "a", "b", "c", "exp", "intreset_gene_exp",
        "p_adjust", "method"))
    clusterEvalQ(cl, expr = library(correlation))
    clusterEvalQ(cl, expr = library(tidyverse))

    repeat {
        a <- parSapply(cl, genename, function(genename) {
            correlation::correlation(data = intreset_gene_exp[, i, drop = F], data2 = exp[,
                genename, drop = F], p_adjust = p_adjust, method = method)
        })
        b <- as.data.frame(t(as.data.frame(a)))

        c <- bind_rows(c, b)
        i <- i + 1
        clusterExport(cl, "i")

        if (i > ncol(intreset_gene_exp)) {
            stopCluster(cl)
            return(c)
            break
        }
    }
}
